class Solution {
public:
    vector<int> findSubstring(string s, vector<string>& words) {
        vector<int> ret;
        unordered_map<string,int> hash1;
        long long left=0;long long right=0;
        long long len=words[0].size();
        long long cnt=0;long long m=words.size();
        for(auto& e:words)
        {
            hash1[e]++;
        }
        for(int i=0;i<len;i++)
        {
            left=i;right=i;
            unordered_map<string,int> hash2;
            cnt=0;//注意重置cnt
            while(right+len<=s.size())//注意等于也可以
            {
            //进窗口
                string x=s.substr(right,len);//注意传的第二个参数是截取字符串的长度！！！！！
                hash2[x]++;
                if(hash2[x]<=hash1[x]) {cnt++;}
            
                if(right-left+1>m*len)
                {
                    //维护窗口
                    string y=s.substr(left,len);
                    if(hash2[y]<=hash1[y]) cnt--;
                    hash2[y]--;
                    left+=len;
                }
                right+=len;
                if(cnt==m) ret.push_back(left);//注意，更新状态你不得在while里面更新吗
            }
        }
        return ret;
     }
};